package com.atguigu.recursion;

/**
 * @author shkstart
 * @create 2021-08-15 18:27
 */
public class MiGong {
    public static void main(String[] args) {
        //地图
        //墙为一
        int[][] map = new int[8][7];
        for (int i=0;i<7;i++){
            map[0][i]=1;
            map[7][i]=1;
        }
        for (int i=0;i<8;i++){
            map[i][0]=1;
            map[i][6]=1;
        }
        map[3][1]=1;
        map[3][2]=1;
//        map[1][2]=1;
//        map[2][2]=1;
        //输出地图
        System.out.println("开始时的地图！");
        for (int [] s:map){
            for (int data:s){
                System.out.print(data+" ");
            }
            System.out.println();
        }
        //使用回溯
        setWay2(map,1,1);
        System.out.println("迷宫行走");
        for (int i=0;i<8;i++){
            for (int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }
    //使用递归回溯来个小球找路

    /**
     *
     * @param map 使用的地图
     * @param i 出发的地点
     * @param j
     * @return
     */
    //0代表从未走过，1代表一堵墙，2代表走通，3代表走过但是路堵
    public static boolean setWay(int [][] map,int i,int j) {
        //判断是否到达终点
        if (map[6][5] == 2) {
            return true;
        }
        //判断是否开头可以走
        if (map[i][j] == 0) {
            //假设起点为2；
            map[i][j] = 2;
            //按照下--右--上--左道路走
            if (setWay(map, i + 1, j)) {
                return true;
            } else if (setWay(map, i, j + 1)) {
                return true;
            } else if (setWay(map, i - 1, j)) {
                return true;
            } else if (setWay(map, i - 1, j)) {
                return true;
            }else {
                //四个方向都不行，说明无路可走，路已经堵住
                map[i][j]=3;
                return false;
            }
        } else {
            return false;
        }
    }
//改变策略，上--右--下--左
    public static boolean setWay2(int [][] map,int i,int j) {
        //判断是否到达终点
        if (map[6][5] == 2) {
            return true;
        }
        //判断是否开头可以走
        if (map[i][j] == 0) {
            //假设起点为2；
            map[i][j] = 2;
            //按照下--右--上--左道路走
            if (setWay2(map, i - 1, j)) {
                return true;
            } else if (setWay2(map, i, j + 1)) {
                return true;
            } else if (setWay2(map, i + 1, j)) {
                return true;
            } else if (setWay2(map, i - 1, j)) {
                return true;
            }else {
                //四个方向都不行，说明无路可走，路已经堵住
                map[i][j]=3;
                return false;
            }
        } else {
            return false;
        }
    }
}
